package com.zlxtk.ling;


// import net.openhft.affinity.Affinity;
// import net.openhft.affinity.AffinityLock;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.Iterator;
import java.util.List;

public class AppointCpuTest {
    public static void main(String[] args) {

        /**
         * 指定程序在哪个cpu上运行
         *
         * Oracle JRockit JVM 是业界性能最高的 Java 虚拟机，现内置于 Oracle 融合中间件中。
         * 它通过 JRockit Real Time 提供业内领先的实时基础架构功能，
         * 通过 JRockit Mission Control 提供无与伦比的 JVM 诊断。
         *
         * 安装和环境配置与普通jdk一样
         *
         * 官网下载地址：https://www.oracle.com/java/technologies/javase-java-archive-jrockit-downloads.html
         */


        /**
         // 获取jvm对象
         JVM jvm = JVMFactory.getJVM();
         // 获取cpu集合的叠代对象
         Iterator<CPU> cpuIterator = jvm.getProcessAffinity().iterator();
         // 用于保存系统中所有cpu的集合
         List<CPU> systemCpuList = new ArrayList<CPU>();
         while (cpuIterator.hasNext()) {
         CPU cpu = cpuIterator.next();
         systemCpuList.add(cpu);
         }
         // 系统中cpu的个数
         int cpuCount = systemCpuList.size();
         // 需要绑定到jvm的cpu集合
         List<CPU> bindCpuList = new ArrayList<CPU>();
         // 绑定最后一个cpu运行此程序
         int appointCpuIndex = cpuCount - 1;
         bindCpuList.add(systemCpuList.get(appointCpuIndex));
         // 将指定的cpu集合绑定到jvm中
         jvm.suggestProcessAffinity(bindCpuList);

         System.out.println("系统中CPU个数：" + cpuCount);
         System.out.println("当前程序指定CPU运行序号：" + appointCpuIndex);

         //保持程序不退出
         while (true) {

         }
         */


        /**
         * 线程绑定CPU核
         * 参考：
         * https://blog.csdn.net/w57685321/article/details/111350424
         *  https://blog.csdn.net/shenwansangz/article/details/50297637
         *
         */
        //指定一个cpu
        // try (AffinityLock al = AffinityLock.acquireLock(5)) {
        //     // do some work while locked to a CPU.
        //     System.out.println(al.cpuId());
        // }catch (Exception e){
        //     e.printStackTrace();
        // }


        //getAffinity获取进程的关联性掩码，查看当前线程能够在哪几个cpu核心运行
        // try {
        //     BitSet bitSet = Affinity.getAffinity();
        //     // int cpuIndex = Affinity.getCpu();
        // } catch (Exception e) {
        //     e.printStackTrace();
        // }
        // //指定哪些cpu上执行
        // BitSet bitSet1 = new BitSet();
        // bitSet1.set(4);
        // bitSet1.set(5);
        // bitSet1.set(6);
        // bitSet1.set(7);
        // Affinity.setAffinity(bitSet1);


    }
}
